<?php
namespace Pinenut\Cache\Adapter;

use Pinenut\Cache\Adapter;

/**
 * Адаптер к Memcached
 *
 * @install sudo apt-get install memcached php5-memcahced
 * 
 * @author kosh
 *        
 */
class Memcached extends Adapter {

	static $config = '\MemcachedAdapterConfig';

	/**
	 *
	 * @var \Memcached
	 */
	protected $connect = null;

	/**
	 * TODO: жопой чую - инициализацию надо выносить в DI,
	 * а может и создание адаптреа в моделях как таковых делать через DI, используя один адаптер
	 * 
	 * @return Memcached
	 */
	function connect( ) {
		
		if (null === $this->connect) {
//			\Log::begin(null, 'Memcached');
			$configClassName = static::$config;
			$config = $configClassName::get($this->collection);
			
			$this->connect = new \Memcached($this->collection);
			// если сервера не проинициированы
			// TODO: сделать более качественную сверку
			if (count($this->connect->getServerList()) !=
				 count($config['servers'])) {
				$this->connect->resetServerList();
				$this->connect->addServers($config['servers']);
			}
			
//			\Log::end('Connect', array());
		}

		return $this->connect;
	}

	function get($keys) {
// 		\Log::begin(null, 'Memcached');
		
		$keys = (array) $keys;
		$result = $this->connect()->getMulti($keys);
		
// 		\Log::end('Get', array(
// 			'keys' => $keys,
//  			'result' => array_keys($result),
 			
//  		));
		return $result;
	}

	function set($keys, $data = null, $expired = null) {
//		\Log::begin(null, 'Memcached');
		if (is_array($keys)) {
			$items = $keys;
		} else {
			$items = [
				$keys => $data
			];
		}
		//\Log::warn('set', array_keys($items));
		$this->connect()->setMulti($items, intval($expired));
		
// 		\Log::end('Set', array(
// 			'keys' => array_keys($items),
// 			'expired' => intval($expired), 
// 		));
		
	}

	function delete($keys) {
//		\Log::begin(null, 'Memcached');
		
		$keys = (array) $keys;
		$this->connect()->deleteMulti($keys);
		
// 		\Log::end('Delete', array(
// 			'keys' => $keys
// 		));
	}
	
	// TODO: выпилить
	function getAllKeys( ) {
		return $this->connect()->getAllKeys();
	}
}